//编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性： 
//
// 
// 每行的元素从左到右升序排列。 
// 每列的元素从上到下升序排列。 
// 
//
// 
//
// 示例 1： 
// 
// 
//输入：matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21
//,23,26,30]], target = 5
//输出：true
// 
//
// 示例 2： 
// 
// 
//输入：matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21
//,23,26,30]], target = 20
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// m == matrix.length 
// n == matrix[i].length 
// 1 <= n, m <= 300 
// -10⁹ <= matrix[i][j] <= 10⁹ 
// 每行的所有元素从左到右升序排列 
// 每列的所有元素从上到下升序排列 
// -10⁹ <= target <= 10⁹ 
// 
//
// Related Topics 数组 二分查找 分治 矩阵 👍 1321 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2023-08-13 03:51:20
 * @description 240.搜索二维矩阵 II
 */
public class SearchA2dMatrixIi{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Solution solution = new SearchA2dMatrixIi().new Solution();

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
		 //Z 字形查找  从右上角开始，左边小，下变大，只能左或者下  时间O（m+n)
    public boolean searchMatrix(int[][] matrix, int target) {
		int m = matrix.length, n = matrix[0].length;
		// 初始化在右上角
		int i = 0, j = n - 1;
		while (i < m && j >= 0) {
			if (matrix[i][j] == target) {
				return true;
			}
			if (matrix[i][j] < target) {
				// 需要大一点，往下移动
				i++;
			} else {
				// 需要小一点，往左移动
				j--;
			}
		}
		// while 循环中没有找到，则 target 不存在
		return false;
	}

	/*对每一行二分查找  时间O（mlogn)*/
	public boolean searchMatrix1(int[][] matrix, int target) {
		for (int[] row : matrix) {
			if(search(row,target)==true){
				return true;
		}
	}
		return false;
    }
	private  boolean search(int[] nums,int k){
		int l=0,r=nums.length-1;
		while(l<=r){
			int  m=l+(r-l)/2;
			int num = nums[m];
			if(num==k) {
				return true;
			}else if(num>k){
				r=m-1;
			}else {
				l=m+1;
			}

		}
		return  false;
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
